package cn.hicard.risk.action.bd;

import java.io.File;
import java.io.FileOutputStream;

import org.apache.log4j.Logger;

import cn.hicard.risk.common.Constant;
import cn.hicard.risk.entity.BdCallorder;
import cn.hicard.risk.service.bd.CallorderService;
import cn.hicard.util.AppConfig;
import cn.hicard.util.DateHelp;

public class CallorderImageFlex {
	
	/** 日志记录工具 */
	private Logger logger = Logger.getLogger(Constant.LOGGER_MAIN);
	
	/** 调单业务类 */
	private CallorderService callorderService;
		
	public void setCallorderService(CallorderService service) {
		this.callorderService = service;
	}
	
	/**
	 * 取得调单小票相对于项目目录的路径
	 * @return
	 */
	public String getImageDir(){
				
		return AppConfig.get("callorder_imgdir");
	}
	
	/**
	 * 取得调单小票的路径缓存目录
	 * @return
	 */
	public String getImageCacheDir(){
				
		return AppConfig.get("callorder_cachedir");
	}
	
	/**
	 * 将临时目录中的图片保存到正式目录，并更新调单记录中的图片信息
	 * @param callorder
	 * @return
	 */
	public String saveImage(BdCallorder callorder){
		String msg = "";
		logger.debug("更新调单小票图片开始……");
		
		//[start] 路径定位
		// 跟据类加载路径定位到项目目录
		String root = getClass().getResource("/../../").getPath();
		
		// 图片临时相对目录 // 确保路径末尾有一个'/'
		String cacheDir = AppConfig.get("callorder_cachedir");
		if(cacheDir.charAt(cacheDir.length()-1) != '/'){
			cacheDir += '/';
		}
		// 转为绝对路径
		cacheDir = root + cacheDir;
		cacheDir = cacheDir.replace("//", "/");
		
		// 图片保存相对目录 // 确保路径末尾有一个'/'
		String picdir = AppConfig.get("callorder_imgdir");
		if(picdir.charAt(picdir.length()-1) != '/'){
			picdir += '/';
		}
		// 转为绝对路径
		picdir = root + picdir;
		picdir = picdir.replace("//", "/");
		//[end] 路径定位
		
		String cacheImg = cacheDir + callorder.getPicname();
		String targetImg = picdir + callorder.getPicname();
		logger.debug("准备将文件[" + cacheImg + "]移动到[" + targetImg + "]");
		File imageFile = new File(cacheImg);
		if(  !  imageFile.exists()){
			msg = "临时小票图片不存在，无法保存";
		}else{
			imageFile.renameTo(new File(targetImg));
			callorder.setUploaddate(DateHelp.dateTime());
			try {
				callorderService.update(callorder);
				msg = "保存调单图片成功！";
			} catch (Exception e) {
				msg = "保存调单图片时服务器出错:" + e.getMessage() + "\r\n请联系开发或运维人员" ;
				logger.error("", e);
			}
		}
		logger.debug(msg);
		logger.debug("更新调单图片结束…");
		return msg;
	}
	
	/**
	 * 上传小票图片至服务器临时目录
	 * @param content
	 * @param callorder
	 * @return
	 */
	public String uploadImage(byte[] content, BdCallorder callorder){
		// 图片名称
		String fileName = callorder.getDatatype() + "_" + callorder.getPkCallorder() + callorder.getPicname();
		// 图片临时相对目录		
		String cacheDir = AppConfig.get("callorder_cachedir");
		if(cacheDir.charAt(cacheDir.length()-1) != '/'){
			cacheDir += '/';
		}
		// 转为绝对路径
		cacheDir = getClass().getResource("/../../").getPath() + cacheDir;
		cacheDir = cacheDir.replace("//", "/");
		logger.debug("调单小票临时保存目录:" + cacheDir);
		// 文件输出流
		FileOutputStream fos = null;
		
		try {
			fos = new FileOutputStream(cacheDir + fileName);
			fos.write(content);
			fos.flush();
			logger.debug("小票临时保存成功");
		} catch (Exception e) {
			logger.error("", e);
		} finally {
			if(fos != null) {
				try{
					fos.close();
				}catch(Exception e){}
			}
		}
		
		return fileName;
	}

	/**
	 * 从服务器上删除调单小票
	 * @param callorder
	 * @return
	 */
	public String deleteImage(BdCallorder callorder){
		String msg = "";
		logger.debug("删除调单小票图片开始……");
		
		//[start] 路径定位
		// 跟据类加载路径定位到项目目录
		String root = getClass().getResource("/../../").getPath();
		
		// 图片临时相对目录 // 确保路径末尾有一个'/'
		String cacheDir = AppConfig.get("callorder_cachedir");
		if(cacheDir.charAt(cacheDir.length()-1) != '/'){
			cacheDir += '/';
		}
		// 转为绝对路径
		cacheDir = root + cacheDir;
		cacheDir = cacheDir.replace("//", "/");
		
		// 图片保存相对目录 // 确保路径末尾有一个'/'
		String picdir = AppConfig.get("callorder_imgdir");
		if(picdir.charAt(picdir.length()-1) != '/'){
			picdir += '/';
		}
		// 转为绝对路径
		picdir = root + picdir;
		picdir = picdir.replace("//", "/");
		//[end] 路径定位
		
		/*****************      其实，说是删除，但是，还是留下一小点恢愎的机会吧，扔到临时目录   ************************/
		
		String targetImg = cacheDir + "delete_" + DateHelp.dateNumberExact() + callorder.getPicname();
		String deleteImg  = picdir + callorder.getPicname();
		logger.debug("模拟删除，准备将文件[" + deleteImg + "]移动到[" + targetImg + "]");
		File imageFile = new File(deleteImg);
		// 文件不存在，或路径是一个目录，则不充许删除
		if(  !  imageFile.exists() || imageFile.isDirectory()){ 
			msg = "小票图片不存在，无法删除";
		}else{
			imageFile.renameTo(new File(targetImg));
			callorder.setUploaddate(DateHelp.dateTime());
			try {
				callorder.setPicname("");
				callorder.setUploaddate("");
				callorderService.update(callorder);
				msg = "删除临时小票图片成功！";
			} catch (Exception e) {
				msg = "删除临时小票图片时服务器出错:" + e.getMessage() + "\r\n请联系开发或运维人员" ;
				logger.error("", e);
			}
		}
		logger.debug(msg);
		logger.debug("更新调单小票图片结束…");
		return msg;
	}
	
	
}
